import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { OssService } from '../common/oss.service';
import { PostsModule } from './posts/posts.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigService, ConfigModule } from '@nestjs/config';
import envConfig from '../config/env';
import { UserModule } from './user/user.module';
import { AuthModule } from './auth/auth.module';
import { CategoryModule } from './category/category.module';
import { TagModule } from './tag/tag.module';
import { CustomerModule } from './customer/customer.module';
import { RedisCacheModule } from './db/redis-cache.module';
// @Module 装饰器 可以理解为封装好的函数，是一个语法糖写法
@Module({ // .mudule文件需要使用一个@Module() 装饰器的类,装饰器接收四个属性：providers、controllers、imports、exports。
  imports: [ // 导入模块的列表，如果需要使用其他模块的服务，需要通过这里导入
    ConfigModule.forRoot({ isGlobal: true, envFilePath: [envConfig.path] }),
    ConfigModule.forRoot({ isGlobal: true }), // 设置为全局
    // 数据库配置
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        type: 'mysql', // database type
        host: configService.get('DB_HOST'), // host
        port: configService.get<number>('DB_PORT'), // port number
        username: configService.get('DB_USER'), // user name
        password: configService.get('DB_PASSWORD'), // password
        database: configService.get('DB_DATABASE'), // database name
        // charset: 'utf8mb4',
        timezone: '+08:00',
        synchronize: true, // 注意：根据实体自动创建数据库表， 生产环境建议关闭，不然数据库会变乱
        autoLoadEntities: true,
      }),
    }),
    PostsModule,
    UserModule,
    AuthModule,
    CategoryModule,
    TagModule,
    CustomerModule,
    RedisCacheModule
  ],
  controllers: [AppController], // 处理http请求，包括路由控制，向客户端返回响应，将具体业务逻辑委托给providers处理
  providers: [AppService, OssService], // Nest.js注入器实例化的提供者（服务提供者），处理具体的业务逻辑，各个模块之间可以共享
})
// AppModule 是应用程序的根模块，根模块提供了用来启动应用的引导机制，可以包含很多功能模块
export class AppModule {}
